package oop.controller.action.mark;

import java.sql.SQLException;
import java.text.ParseException;
import java.util.Date;
import java.util.List;

import oop.controller.action.DefaultAction;
import oop.data.Examination;
import oop.data.Mark;
import oop.data.TestVersion;
import oop.db.dao.ExaminationDAO;
import oop.db.dao.MarkDAO;
import oop.db.dao.TestVersionDAO;
import oop.taglib.UtilFunctions;

import com.oreilly.servlet.ParameterNotFoundException;

public class CreateAction extends DefaultAction {

	@Override
	public void performImpl() throws SQLException {
		long examinationId;
		try {
			examinationId = getParams().getLong("mc_exam");
		} catch (NumberFormatException e) {
			error("Mã số bài kiểm tra không hợp lệ.");
			return;
		} catch (ParameterNotFoundException e) {
			error("Bạn cần chọn bài kiểm tra.");
			return;
		}

		examination = ExaminationDAO.fetchById(examinationId);
		versions = TestVersionDAO.fetchByTest(examination.getTest().getId());
		request.setAttribute("exam", examination);
		request.setAttribute("versions", versions);

		String submit = request.getParameter("mc_submit");
		if ("create".equals(submit)) {
			doCreate();
		}
	}

	private void doCreate() throws SQLException {
		TestVersion testVersion;
		try {
			testVersion = TestVersionDAO.fetchById(getParams()
					.getLong("mc_version"));
		} catch (NumberFormatException e) {
			versionError = "Mã số phiên bản đề không hợp lệ.";
			return;
		} catch (ParameterNotFoundException e) {
			versionError = "Bạn cần chọn phiên bản đề.";
			return;
		}

		String studentName;
		try {
			studentName = getParams().getString("mc_name");
		} catch (ParameterNotFoundException e) {
			studentNameError = "Bạn cần chọn phiên bản đề.";
			return;
		}
		String studentSurname = request.getParameter("mc_surname");
		String studentId = request.getParameter("mc_sid");

		Date studentBirthday;
		try {
			studentBirthday = UtilFunctions.parseDate(getParams().getString("mc_sbirthday"));
		} catch (ParameterNotFoundException ex) {
			studentBirthday = null;
		} catch (ParseException e) {
			studentBirthdayError = "Định dạng ngày sinh không hợp lệ.";
			return;
		}

		if (!MarkDAO.fetchByStudentInfo(studentName, studentSurname, studentId,
				studentBirthday).isEmpty()) {
			studentNameError = "Sinh viên đã có trong danh sách.";
			return;
		}
		
		try {
			Mark mark = MarkDAO.create(testVersion.getId(), studentName,
					studentSurname, studentId, studentBirthday, 0, examination
							.getId());

			setNextAction("mark.editchoices&mode=create&mi_mark=" + mark.getId());
		} catch (NumberFormatException ex) {
			request.setAttribute("message", "id không hợp lệ");
			setNextAction("error");
		}
	}

	private String versionError;
	private Examination examination;
	private List<TestVersion> versions;
	private String studentNameError;
	private String studentBirthdayError;

	public String getVersionError() {
		return versionError;
	}

	public String getStudentBirthdayError() {
		return studentBirthdayError;
	}

	public String getStudentNameError() {
		return studentNameError;
	}

}
